package com.ujiuye.servlet;

import com.ujiuye.pojo.Student;
import com.ujiuye.service.StudentService;
import com.ujiuye.utils.MyUtils;
import com.ujiuye.utils.PageTools;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * StudentServlet
 */
//必须要加上该注解，才能接受到文件
@MultipartConfig
@WebServlet("/studentServlet")
public class StudentServlet extends BaseServlet {

    private StudentService studentService = new StudentService();

    /**
     * 添加学生
     * @param req
     * @param resp
     */
    public void insertStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        //接收参数 sname、sex、hobby、sbir
        String sname = req.getParameter("sname");
        String sex = req.getParameter("sex");
        String bir = req.getParameter("sbir");
        String[] hobbies = req.getParameterValues("hobby");

        /**
         * 处理参数
         * 将bir转成Date类型
         * 将hobbies转成字符串
         */
        String hobby = MyUtils.arrayToString(hobbies);
        Date sbir = MyUtils.stringToDate(bir);

        //封装成实体类
        Student s = new Student(sname,sex,sbir,hobby);

        /**
         * 处理图片
         *三个步骤:
         *         1、method必须是post
         *         2、enctype改成  multipart/form-data
         *         3、在servlet上加上注解  @MultipartConfig
         *
         * 对图片的处理
         *      1、数据库不能保存图片，在公司里面有专门的图片服务器用来存储图片
         *          保存图片:将图片保存到图片服务器中，在将图片名称保存在数据库里面
         *          使用图片: 先从数据库中找到图片名称，在通过图片名称在图片服务器找到对应的图片
         *
         *      2、项目处理  使用本地的一个文件夹当做图片服务器
         *          保存图片；将图片保存到本地文件夹中，在将图片名称保存到数据库
         *          使用图片: 先从数据库中找到图片名称,在通过图片名称在本地文件夹找到对应的图片使用
         *
         *
         *
         *
         */
        //接收图片
        Part part = req.getPart("photo");

        //获取图片的名称   如果没有上传图片  获取的是空串""
        String photoName = part.getSubmittedFileName();
        System.out.println(photoName);
        //走if 说明没有上传图片或者上传图片的格式不对
        if("".equals(photoName) || !(photoName.endsWith(".jpg") || photoName.endsWith(".png"))) {
            //给上默认的图片  默认图片是1.jpg
            s.setPhoto("1.jpg");
        }else {  //上传了图片
            //1、保存图片名称到数据库    2、保存到本地文件夹

            /**
             * 图片名称覆盖问题
             * UUID生成永远都不会重复的36字符串
             */
            photoName = UUID.randomUUID() + photoName;

            //保存到本地文件夹
            File path = new File("D://studentpic");
            //判断路径是否存在
            if(!path.exists()) {
                //不存在创建该路径
                path.mkdirs();
            }
            //将图片写到该文件夹中  D://studentpic/123.jpg
            part.write(path + "/" + photoName);

            //将图片名称放到student对象中
            s.setPhoto(photoName);

        }

        //调用service方法 添加学生信息
        int i = studentService.insertStudent(s);

       if(i > 0) {
           pageQueryStudent(req,resp);
       }else {
           System.out.println("添加失败");
       }

    }

    /**
     * 分页查询
     * @param req
     * @param resp
     */
    public void pageQueryStudent(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 准备好分页工具类三个参数
         * 当前页
         * 每页显示的条数
         * 总条数
         */
        //处理当前页   前台传递了当前页 转成int类型  没有传递默认是第一页
        String currentPage = req.getParameter("currentPage");
        int cp = 1;
        //没有传递当前页
        if(currentPage != null && !"".equals(currentPage)) {
            cp = Integer.parseInt(currentPage);
        }

        //处理每页显示的条数
        int pageSize = 5;

        //总条数  查询数据库
        int totalSize = studentService.queryCountStudent();

        //封装分页工具类
        PageTools pt = new PageTools(cp, pageSize, totalSize);

        //查询对应的数据
        List<Student> lists = studentService.pageQueryStudent(pt);

        //把lists集合放到作用域中
        req.setAttribute("studentLists",lists);

        //把分页工具类也放到作用域中
        req.setAttribute("pt",pt);

        //转发到首页
        req.getRequestDispatcher("student_main.jsp").forward(req,resp);

    }

    /**
     * 删除
     * @param req
     * @param resp
     */
    public void deleteStudentBySid(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进来了");
        //接收sid
        int sid = Integer.parseInt(req.getParameter("sid"));
        System.out.println(sid);
        //传递给service
        int i = studentService.deleteStudentBySid(sid);
        System.out.println(i);

        if(i > 0) {
            //接收图片名称
            String photo = req.getParameter("photo");

            //假如photo 不等于1.jpg  删除掉
            if(!"1.jpg".equals(photo)) {
                File f = new File("D:/studentpic/" + photo);
                f.delete();
            }
            //删除成功 跳回主页
            pageQueryStudent(req,resp);

        }else {
            //删除失败
            System.out.println("删除失败");
        }

    }

    /**
     * 修改数据的回显
     * @param req
     * @param resp
     */
    public void queryStudentBySid(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进来");
        int sid = Integer.parseInt(req.getParameter("sid"));
        //通过sid查询该学生信息
        Student s = studentService.queryStudentBySid(sid);
        //放到作用域中
        req.setAttribute("student",s);

        System.out.println(s);
        //转发修改页面进行数据的回显
        req.getRequestDispatcher("student_update.jsp").forward(req,resp);
    }

    /**
     * 修改学生
     * @param req
     * @param resp
     */
    public void updateStudent(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException {

        //接收参数
        String sname = req.getParameter("sname");
        String sex = req.getParameter("sex");
        String bir = req.getParameter("sbir");
        String[] hobbies = req.getParameterValues("hobby");
        int sid = Integer.parseInt(req.getParameter("sid"));

        //接收老的图片名称
        String oldPhoto = req.getParameter("oldPhoto");
        /**
         * 处理参数
         * 将bir转成Date类型
         * 将hobbies转成字符串
         */
        String hobby = MyUtils.arrayToString(hobbies);
        Date sbir = MyUtils.stringToDate(bir);

        //封装成实体类
        Student s = new Student(sname,sex,sbir,hobby);
        s.setSid(sid);

        //处理图片
        /**
         * 是否修改图片
         * 修改了图片
         *      数据库数据要替换， 把新的图片保存到文件夹中，把旧的图片删除掉
         * 没有修改图片
         *      不用修改  还是原来的图片
         */

        //获取图片
        Part part = req.getPart("photo");
        //获取图片名称
        String newPhoto = part.getSubmittedFileName();
        //上传新的图片
        if(!"".equals(newPhoto)) {
            //通过uuid拼接新的图片名称
            newPhoto =  UUID.randomUUID() + newPhoto;
            //保存到本地文件夹 D://studentpic
            File path = new File("D://studentpic");
            //写进去
            part.write(path + "/" + newPhoto);
            //将新的图片名称 赋值给student对象
            s.setPhoto(newPhoto);

            //还要删除老的图片名称
            new File("D://studentpic/" + oldPhoto).delete();
        }else {
            //没有上传新的图片
            s.setPhoto(oldPhoto);
        }

        //调用service方法修改
        int i = studentService.updateStudent(s);
        if(i > 0) {
            //修改成功
            pageQueryStudent(req,resp);
        }else {
            System.out.println("修改失败");
        }

    }

    /**
     * 批量删除
     * @param req
     * @param resp
     */
    public void batchDeleteStudent(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
        //接收参数
        String sids = req.getParameter("sids");
        //传递给service
        int i = studentService.batchDeleteStudent(sids);
        if(i > 0) {
            //删除成功
            pageQueryStudent(req,resp);
        }else {
            System.out.println("批量删除失败");
        }
    }
}
